package Test.test4.exam1;

import java.io.*;
import java.util.*;

public class Exam1 {
    List<Student> list = new LinkedList<>();


    Scanner sc = new Scanner(System.in);

    public void add(int age, int no, String name, String sex) throws AgeException, NoException {//添加学生发方法抛出自定义年龄和学号异常
        if (age < 0 || age > 100) {
            throw new AgeException("年龄异常");
        }
        if (no < 1000 || no > Integer.MAX_VALUE) {
            throw new NoException("学号异常");
        }
        list.add(new Student(age, no, name, sex));
        System.out.println("学生信息添加成功");

    }

    public void del(int no) {//删除学生方法

        for (Student s : list) {//遍历学生
            if ((s.getNo() == no)) {//查找要删除学生的学号
                list.remove(s);
                System.out.println("学号为" + no + "的学生删除成功");
                return;
            }
        }
        System.out.println("学生信息不存在");
    }

    public void update(int no) {//修改学生信息
        for (Student s : list) {
            if ((s.getNo() == no)) {
                System.out.println("请输入要修改的内容的序号");
                System.out.println("1.修改姓名");
                System.out.println("2.修改学号");
                System.out.println("3.修改年龄");
                System.out.println("4.修改性别");
                switch (sc.nextInt()) {
                    case 1:
                        System.out.println("请输入要修改的姓名");
                        s.setName(sc.next());
                        break;
                    case 2:
                        System.out.println("请输入要修改的学号");
                        s.setNo(sc.nextInt());
                        break;
                    case 3:
                        System.out.println("请输入要修改的姓名");
                        s.setAge(sc.nextInt());
                        break;
                    case 4:
                        System.out.println("请输入要修改的性别");
                        s.setSex(sc.next());
                        break;
                    default:
                        System.out.println("输入错误");
                }
                return;

            }
        }

        System.out.println("学生信息不存在");


    }
    public void select(int no) {//查找学生信息
        for (Student s : list) {//遍历学生信息
            if ((s.getNo() == no)) {//匹配学号
                System.out.println("查询到学生的信息是" + s.toString());
                return;
            }
        }
        System.out.println("学生信息不存在");
    }

    public void reader() {//从文件读取学生信息
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("E:\\student.txt"));
            Object obj = null;
            while (null != (obj = ois.readObject())) {
                list.add((Student) obj);

            }
        } catch (EOFException e1) {
            // TODO Auto-generated catch block
        } catch (Exception e1) {
            // TODO Auto-generated catch block

        }

        if (null != ois) {
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }




    public void writer() {//将学生信息写入文件

        ObjectOutputStream oop = null;
        try {
            oop = new ObjectOutputStream(new FileOutputStream("E:\\student.txt"));
            Iterator<Student> iterator = list.iterator();//获取列表迭代器
            while (iterator.hasNext()) {
                oop.writeObject(iterator.next());//分别将学生对象添加到文件
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (null != oop) {
            try {

                oop.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void setNum(int i) throws NumException {//判断序号异常
        if (i < 0 || i > 5) {
            throw new NumException();
        }

    }


    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        Exam1 exam1 = new Exam1();
        try {
            exam1.reader();//程序运行,先从文件读取数据
        } catch (Exception e) {
            // TODO: handle exception
        }


        while (true) {
            System.out.println("欢迎来到拉勾学生管理系统");
            System.out.println("请输入序号[0-5]选择相应的功能");
            System.out.println("1.添加学生信息");
            System.out.println("2.删除学生信息");
            System.out.println("3.修改学生信息");
            System.out.println("4.查找学生信息");
            System.out.println("5.遍历学生信息");
            System.out.println("0.退出学生信息系统");
            try {
                int i = sc.nextInt();
                exam1.setNum(i);//从键盘获取序号判断要执行的功能
                switch (i) {
                    case 1://添加学生信息
                        System.out.println("请输入需要添加学生姓名");
                        String name = sc.next();
                        System.out.println("请输入需要添加学生年龄");
                        int age = sc.nextInt();
                        System.out.println("请输入需要添加学生学号");
                        int no = sc.nextInt();
                        System.out.println("请输入需要添加学生性别");
                        String sex = sc.next();
                        try {
                            exam1.add(age, no, name, sex);
                        } catch (NoException | AgeException e) {
                            e.printStackTrace();
                        } finally {
                            break;
                        }


                    case 2: {//根据学号删除学生信息
                        System.out.println("请输入需要删除学生学号");
                        exam1.del(sc.nextInt());
                        break;
                    }

                    case 3://根据学号修改学生信息
                        System.out.println("请输入要修改学生的信息的学号");
                        exam1.update(sc.nextInt());
                        break;
                    case 4://根据学号查找学生信息
                        System.out.println("请输入要查找学生的信息的学号");
                        exam1.select(sc.nextInt());
                        break;
                    case 5://遍历学生信息
                        System.out.println(exam1.list.toString());
                        break;
                    case 0://将学生信息写入文件并退出系统
                        System.out.println("退出系统");
                        exam1.writer();
                        System.out.println("信息写入成功");
                        return;
                }
            } catch (InputMismatchException e) {
                sc.next();
                System.out.println("————————————————格式输入错误，请重新输入——————————————————");

            } catch (NumException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }


}
